#include "thread.h"
#include "signal.h"
#include <stdio.h>
#include <assert.h>
#include <signal.h>
#include <sys/time.h>
#include <limits.h>

thread_t thread[2];


void traitement_signal(int num) {

  printf("Signal %d reçu par thread %p !\n", num, thread_self());

}



static void * threadfunc(void * arg)
{
  
  // On crée un gestionnaire de signal pour un signal numero 1
  sigaction_t(1, traitement_signal);
  sigaction_t(2, traitement_signal);
  sigaction_t(4, traitement_signal);

  char *name = arg;
  printf("thread lancé %p, arg %s, attente signaux éventuels\n",
	 thread_self(), name);


  int i;
  for(i=0;i!=INT_MAX;i++) {
    
  }


  if(thread[1] != thread_self()) {
    printf("Envoie d'un signal 4 depuis thread %p vers thread %p\n", thread_self(), thread[1]);
    kill_t(thread[1], 4);
  }

 
  for(i=0;i!=INT_MAX;i++) {
    
  }

  thread_exit(arg);
  return NULL;
}

int main(void)
{

  void *retval[2];
  int err;
  char s[2][12];
  int i;
  printf("main %p\n",thread_self());

  for(i=0;i<2;i++)
    {
      sprintf(s[i],"thread%d\n",i);
      err = thread_create(&thread[i], threadfunc, s[i]);
      assert(!err);
    }
 
  printf("Envoie d'un signal 1 depuis main vers 1er thread\n");
  kill_t(thread[0], 1);
  printf("Envoie d'un signal 2 depuis main vers 2eme thread\n");
  kill_t(thread[1], 2);
  printf("Envoie d'un signal 3 (gestionnaire non existant) depuis main vers 2eme thread\n");
  kill_t(thread[1], 3);

  for(i=0;i<2;i++)
    {
      printf("le main join le thread%d\n",i);
      err = thread_join(thread[i], &retval[i]);
      printf("le thread %d a terminé en renvoyant %s\n",i,(char *)retval[i]);
    }
 
  return 0;
}
